import random
from DrissionPage import ChromiumPage, ChromiumOptions
from loguru import logger
import time
from sql_utils import *

# 浏览器页面对象设置
def getPage():
    path = r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'  # 浏览器的可执行文件路径
    # 设置无头模式
    co = ChromiumOptions().headless()
    # co = ChromiumOptions()
    # 设置浏览器路径
    co.set_browser_path(path)
    # 来宾模式
    co.set_argument('--guest')
    # 无痕模式
    co.incognito()
    # 设置初始窗口大小
    # co.set_argument('--window-size', '800,900')
    # 阻止“自动保存密码”的提示气泡
    co.set_pref('credentials_enable_service', False)
    # 阻止“要恢复页面吗？Chrome未正确关闭”的提示气泡
    co.set_argument('--hide-crash-restore-bubble')
    # 设置浏览器的UA
    co.set_user_agent(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0')
    # 自动分配端口，从而启动一个全新浏览器
    co.auto_port()
    # 浏览器静音
    co.mute(True)
    # 创建页面对象，并启动或接管浏览器,传入浏览器配置
    page = ChromiumPage(co)
    # 之后出现的弹窗都会自动确认
    page.set.auto_handle_alert()
    return page

if __name__ == '__main__':
    # 获取浏览器对象
    page = getPage()
    # 搜索条件
    query = "Python"

    # 城市 101280100是广州
    # city = "101280100"
    # 城市 101280800是佛山
    city = "101280800"

    # 创建表
    createTable()

    try:
        # 进入到首页页面
        page.get('https://www.zhipin.com/?ka=header-home-logo')

        # 定位搜索框，并输入搜索条件
        page.ele("@class=ipt-search").input(query)
        # 点击搜索按钮
        page.ele("@class=btn btn-search").click()
        time.sleep(2)

        # 开启监听器，监听目标url
        page.listen.start(targets=['www.zhipin.com/wapi/zpgeek/search/joblist.json'])

        # 页数
        pageNum = 30
        for i in range(1,pageNum+1):
            time.sleep(random.randrange(2,4))
            logger.info(f"爬取第{i}页数据")
            page.get(f"https://www.zhipin.com/web/geek/job?query={query}&city={city}&page={i}")
            packet = page.listen.wait()
            response_info = packet.response
            logger.info(f" response_info , url = {response_info.url} ,status = {response_info.status} , body = {response_info.body}")
            # 若数据包成功获取，并且数据不为空
            if response_info.status == 200 and response_info.body != '':
                # 获取职位数据
                jobList = response_info.body['zpData']["jobList"]
                # 插入到数据库中
                job_data_list = []
                for job in jobList:
                    job_dict = {
                        "securityId":job['securityId'],   # 安全id
                        "encryptBossId": job['encryptBossId'],  # 加密BossId
                        "bossName": job['bossName'],  # boss名称
                        "bossTitle": job['bossTitle'],  # boss头衔
                        "encryptJobId": job['encryptJobId'],  # 加密职位id
                        "jobName": job['jobName'],  # 职位名称
                        "salaryDesc": job['salaryDesc'],  # 薪资描述
                        "jobLabels": str(job['jobLabels']),  # 职位标签
                        "jobValidStatus": job['jobValidStatus'],  # 职位有效状态
                        "skills": str(job['skills']),  # 职位所需技能
                        "jobExperience": job['jobExperience'],  # 职位所需经验
                        "jobDegree": job['jobDegree'],  # 职位所需学位
                        "jobType": job['jobType'],  # 职位类型
                        "cityName": job['cityName'],  # 所在城市
                        "areaDistrict": job['areaDistrict'],  # 所在地区
                        "businessDistrict": job['businessDistrict'],  # 所在地点
                        "gps": str(job['gps']),  # gps坐标
                        "brandName": job['brandName'],  # 公司名称
                        "brandStageName": job['brandStageName'],  # 公司融资描述
                        "brandIndustry": job['brandIndustry'],  # 公司所在行业
                        "brandScaleName": job['brandScaleName'],  # 公司规模人数
                        "welfareList": str(job['welfareList']),  # 福利待遇
                        "contact":job['contact'],  # 联系方式
                    }
                    job_data_list.append(job_dict)

                # 插入数据到表中
                insert_list_data(job_data_list)

    except Exception as e:
        logger.exception(f"发生异常，异常信息为 {e} 。")
    finally:
        logger.info(f"该线程结束运行并关闭浏览器。")
        # 关闭浏览器
        page.quit()
























